package top.xiangqifu.springboot2_auth.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import top.xiangqifu.springboot2_auth.base.BasePageResult;
import top.xiangqifu.springboot2_auth.base.BaseResult;
import top.xiangqifu.springboot2_auth.dao.TbAuthUserDAO;
import top.xiangqifu.springboot2_auth.dao.TbUserMessageDAO;
import top.xiangqifu.springboot2_auth.dao.TbUserMessageRelationshipDAO;
import top.xiangqifu.springboot2_auth.dao.TbUserMessageReplyDAO;
import top.xiangqifu.springboot2_auth.entity.*;
import top.xiangqifu.springboot2_auth.service.RelationshipService;
import top.xiangqifu.springboot2_auth.utils.AuthInfoUtils;
import top.xiangqifu.springboot2_auth.vo.ReportVo;
import top.xiangqifu.springboot2_auth.vo.ReportrVo;

import java.util.List;
import java.util.Optional;

@Slf4j
@Service
@RequiredArgsConstructor
public class RelationshipServiceImpl implements RelationshipService {

    private final String MESSAGE_LIKE = "留言点赞";
    private final String REPLY_LIKE = "回帖点赞";
    private final String MESSAGE_REPORT = "留言举报";
    private final String REPLY_REPORT = "回帖举报";

    private final TbUserMessageRelationshipDAO tbUserMessageRelationshipDAO;
    private final TbAuthUserDAO tbAuthUserDAO;
    private final TbUserMessageDAO tbUserMessageDAO;
    private final TbUserMessageReplyDAO tbUserMessageReplyDAO;

    @Override
    public BaseResult likeadd(TbUserMessage message){
        //通过拦截器拦截住调用当前接口的用户id
        AuthInfo authInfo= AuthInfoUtils.authInfo();
        //获取当前进行点赞的用户信息
        //tbAuthUserDAO.queryByKey(authInfo.getUserId());通过这个方法获取用户信息
        TbAuthUser user=new TbAuthUser();
        user=tbAuthUserDAO.queryByKey(authInfo.getUserId());
        //建立留言板关联对象用来装点赞的相关信息
        TbUserMessageRelationship like=new TbUserMessageRelationship();
        //key01: 用来装确认用户的信息，用户账号名具有唯一性
        like.setKey01(user.getUserId().toString());
        //type: 因为当前方法是填充点赞类型的方法，所以type默认值为点赞，该数据只与当前进行的方法有关
        like.setType(MESSAGE_LIKE);
        //key02: 用来装确认被留言点赞的帖子信息，因为留言的umid
        TbUserMessage age=tbUserMessageDAO.queryByKey(message.getUmid());
        if (age==null && age.equals("".toString())){
            return BaseResult.fail("留言不存在");
        }
        like.setKey02(message.getUmid().toString());
        //查询用户是否对当前帖子点赞，若点赞则传递对应的umrid
        TbUserMessageRelationship ship=new TbUserMessageRelationship();
        ship=tbUserMessageRelationshipDAO.querylike(like);
        if (ship!=null){
            //进入折说明有点过赞进行取消点赞操作
            int d= tbUserMessageRelationshipDAO.likedelete(ship.getUmrid());
            return BaseResult.ok("取消点赞");
        }
        //到这一步就说明未点赞进行点赞操作
        int i= tbUserMessageRelationshipDAO.likeadd(like);
        if(i!=1) {
            return BaseResult.fail("点赞失败");
        }
        //获取当前帖子的点赞数
        int z= tbUserMessageRelationshipDAO.likequeryAll(like);
        //获取当前帖子的对象
        TbUserMessage message1=tbUserMessageDAO.queryByKey(message.getUmid());
        //为当前帖子赋值点赞数
        message1.setPraiseCount(z);
        //进行修改点赞数
        int y= tbUserMessageDAO.update(message1);
        if(y!=1){
            return BaseResult.fail("点赞失败");
        }
        return BaseResult.ok("点赞成功");
    }

    @Override
    public BaseResult likeradd(TbUserMessageReply reply){
        //通过拦截器拦截住调用当前接口的用户id
        AuthInfo authInfo= AuthInfoUtils.authInfo();
        //获取当前进行点赞的用户信息
        //tbAuthUserDAO.queryByKey(authInfo.getUserId());通过这个方法获取用户信息
        TbAuthUser user=new TbAuthUser();
        user=tbAuthUserDAO.queryByKey(authInfo.getUserId());
        //建立留言板关联对象用来装点赞的相关信息
        TbUserMessageRelationship like=new TbUserMessageRelationship();
        //key01: 用来装确认用户的信息，用户账号名具有唯一性
        like.setKey01(user.getUserId().toString());
        //type: 因为当前方法是填充点赞类型的方法，所以type默认值为点赞，该数据只与当前进行的方法有关
        like.setType(REPLY_LIKE);
        //key02: 用来装确认被留言点赞的帖子信息，因为留言的umid
        TbUserMessageReply age=tbUserMessageReplyDAO.queryByKey(reply.getUmrid());
        if (age==null && age.equals("".toString())){
            return BaseResult.fail("帖子不存在");
        }
        like.setKey02(reply.getUmrid().toString());
        //查询用户是否对当前帖子点赞，若点赞则传递对应的umrid
        TbUserMessageRelationship ship=new TbUserMessageRelationship();
          ship=tbUserMessageRelationshipDAO.querylike(like);
        if (ship!=null){
            //进入折说明有点过赞进行取消点赞操作
            int d= tbUserMessageRelationshipDAO.likedelete(ship.getUmrid());
            return BaseResult.ok("取消点赞");
        }
        //到这一步就说明未点赞进行点赞操作
        int i= tbUserMessageRelationshipDAO.likeadd(like);
        if(i!=1) {
            return BaseResult.fail("点赞失败");
        }
        //获取当前帖子的点赞数
        int z= tbUserMessageRelationshipDAO.likequeryAll(like);
        //获取当前帖子的对象
        TbUserMessage message1=tbUserMessageDAO.queryByKey(reply.getUmrid());
        //为当前帖子赋值点赞数
        message1.setPraiseCount(z);
        //进行修改点赞数
        int y= tbUserMessageDAO.update(message1);
        if(y!=1){
            return BaseResult.fail("点赞失败");
        }
        return BaseResult.ok("点赞成功");
    }


    @Override
    public BasePageResult<List<TbUserMessageRelationship>> querylikeList(TbUserMessage message, PageBean pageBean){
        //分页处理
        pageBean = Optional.ofNullable(pageBean).orElse(new PageBean());
        //启动分页处理
        PageHelper.startPage(pageBean.getPageNumber(), pageBean.getPageSize());
        //查询条件赋值
        TbUserMessageRelationship ship1=new TbUserMessageRelationship();
        ship1.setType(MESSAGE_LIKE);
        ship1.setKey02(message.getUmid().toString());
        //通过条件获取符合条件的用户数据
        List<TbAuthUser> list = tbAuthUserDAO.querylikeList(ship1);
        PageInfo<TbAuthUser> pageInfo = new PageInfo<TbAuthUser>(list);
        pageBean.setPageInfo(pageInfo);
        BasePageResult result = new BasePageResult();
        result.setSuccess(true);
        result.setCode(200);
        result.setMessage("");
        result.setPage(pageBean);
        result.setData(list);
        return result;
    }

    @Override
    public BasePageResult<List<TbUserMessageRelationship>> queryreplyList(TbUserMessageReply reply, PageBean pageBean){
        //分页处理
        pageBean = Optional.ofNullable(pageBean).orElse(new PageBean());
        //启动分页处理
        PageHelper.startPage(pageBean.getPageNumber(), pageBean.getPageSize());
        //查询条件赋值
        TbUserMessageRelationship ship1=new TbUserMessageRelationship();
        ship1.setType(REPLY_LIKE);
        ship1.setKey02(reply.getUmrid().toString());
        //通过条件获取符合条件的用户数据
        List<TbAuthUser> list = tbAuthUserDAO.querylikeList(ship1);
        PageInfo<TbAuthUser> pageInfo = new PageInfo<TbAuthUser>(list);
        pageBean.setPageInfo(pageInfo);
        BasePageResult result = new BasePageResult();
        result.setSuccess(true);
        result.setCode(200);
        result.setMessage("");
        result.setPage(pageBean);
        result.setData(list);
        return result;
    }



    @Override
    public BaseResult reportadd(ReportVo reportVo){
        //通过拦截器拦截住调用当前接口的用户id
        AuthInfo authInfo= AuthInfoUtils.authInfo();
        //获取当前进行点赞的用户信息
        //tbAuthUserDAO.queryByKey(authInfo.getUserId());通过这个方法获取用户信息
        TbAuthUser user=new TbAuthUser();
        user=tbAuthUserDAO.queryByKey(authInfo.getUserId());
        //建立留言板关联对象用来装点赞的相关信息
        TbUserMessageRelationship report=new TbUserMessageRelationship();
        //key01: 用来装确认用户的信息，用户账号名具有唯一性
        report.setKey01(user.getUserId().toString());
        //type: 因为当前方法是填充点赞类型的方法，所以type默认值为点赞，该数据只与当前进行的方法有关
        report.setType(MESSAGE_REPORT);
        //key02: 用来装确认被留言点赞的帖子信息，因为留言的umid
        TbUserMessage age=tbUserMessageDAO.queryByKey(reportVo.getUmid());
        if (age==null && age.equals("".toString())){
            return BaseResult.fail("帖子不存在");
        }
        report.setKey02(reportVo.getUmid().toString());
        //info: 用来装举报的原因
        report.setInfo(reportVo.getInfo());
        //查询用户是否对当前帖子举报，若举报则传递对应的umrid
        TbUserMessageRelationship umrid=tbUserMessageRelationshipDAO.querylike(report);
        if (umrid!=null){
            //提示用户以举报该帖子
            return BaseResult.fail("您已经举报过该帖子");
        }
        //到这一步就说明未举报进行举报操作
        int i= tbUserMessageRelationshipDAO.reportadd(report);
        if(i!=1) {
            return BaseResult.fail("举报失败");
        }
        //获取当前帖子的举报数
        int z= tbUserMessageRelationshipDAO.likequeryAll(report);
        //获取当前帖子的对象
        TbUserMessage message=tbUserMessageDAO.queryByKey(reportVo.getUmid());
        //为当前帖子赋值点赞数
        message.setPraiseCount(z);
        //进行修改点赞数
        int y= tbUserMessageDAO.update(message);
        if(y!=1){
            return BaseResult.fail("举报失败");
        }
        return BaseResult.ok("举报成功");
    }

    @Override
    public BaseResult reportradd(ReportrVo reportrVo){
        //通过拦截器拦截住调用当前接口的用户id
        AuthInfo authInfo= AuthInfoUtils.authInfo();
        //获取当前进行点赞的用户信息
        //tbAuthUserDAO.queryByKey(authInfo.getUserId());通过这个方法获取用户信息
        TbAuthUser user=new TbAuthUser();
        user=tbAuthUserDAO.queryByKey(authInfo.getUserId());
        //建立留言板关联对象用来装点赞的相关信息
        TbUserMessageRelationship report=new TbUserMessageRelationship();
        //key01: 用来装确认用户的信息，用户账号名具有唯一性
        report.setKey01(user.getUserId().toString());
        //type: 因为当前方法是填充点赞类型的方法，所以type默认值为点赞，该数据只与当前进行的方法有关
        report.setType(REPLY_REPORT);
        //key02: 用来装确认被留言点赞的帖子信息，因为留言的umid
        TbUserMessageReply age=tbUserMessageReplyDAO.queryByKey(reportrVo.getUmrid());
        if (age==null && age.equals("".toString())){
            return BaseResult.fail("帖子不存在");
        }
        report.setKey02(reportrVo.getUmrid().toString());
        //info: 用来装举报的原因
        report.setInfo(reportrVo.getInfo());
        //查询用户是否对当前帖子举报，若举报则传递对应的umrid
        TbUserMessageRelationship umrid=tbUserMessageRelationshipDAO.querylike(report);
        if (umrid!=null){
            //提示用户以举报该帖子
            return BaseResult.fail("您已经举报过该帖子");
        }
        //到这一步就说明未举报进行举报操作
        int i= tbUserMessageRelationshipDAO.reportadd(report);
        if(i!=1) {
            return BaseResult.fail("举报失败");
        }
        //获取当前帖子的举报数
        int z= tbUserMessageRelationshipDAO.likequeryAll(report);
        //获取当前帖子的对象
        TbUserMessage message=tbUserMessageDAO.queryByKey(reportrVo.getUmrid());
        //为当前帖子赋值点赞数
        message.setPraiseCount(z);
        //进行修改点赞数
        int y= tbUserMessageDAO.update(message);
        if(y!=1){
            return BaseResult.fail("举报失败");
        }
        return BaseResult.ok("举报成功");
    }

    @Override
    public BasePageResult<List<TbUserMessageReply>> queryReply(TbAuthUser user, PageBean pageBean){
        //分页处理
        pageBean = Optional.ofNullable(pageBean).orElse(new PageBean());
        //启动分页处理
        PageHelper.startPage(pageBean.getPageNumber(), pageBean.getPageSize());
        //通过条件获取符合条件的用户数据
        TbAuthUser user1=tbAuthUserDAO.queryByName(user);
        List<TbUserMessageReply> list=tbUserMessageReplyDAO.queryReply(user1);
        PageInfo<TbUserMessageReply> pageInfo = new PageInfo<TbUserMessageReply>(list);
        pageBean.setPageInfo(pageInfo);
        BasePageResult result = new BasePageResult();
        result.setSuccess(true);
        result.setCode(200);
        result.setMessage("");
        result.setPage(pageBean);
        result.setData(list);
        return result;
    }
}
